在 C++ 模板中,非类型模板参数指的是“模板参数不是一个类型(type),而是一个值(value)”。常见的值包括整数、枚举、指针/引用、成员指针,以及在较新标准中更广义的结构化常量等。它常用于在编译期把常量信息(如数组长度、策略开关)传入模板,从而生成不同的类型或不同实现。
/ˌnɑːn taɪp ˈtɛmpleɪt pəˈræmɪtər/
std::array<int, 3> uses a non-type template parameter to fix the size at compile time.
std::array<int, 3> 使用非类型模板参数在编译期固定数组长度。
By making N a non-type template parameter (e.g., template<int N>), the compiler can unroll loops and optimize code differently for each N.
把 N 设计为非类型模板参数(例如 template<int N>)后,编译器可以针对不同的 N 进行循环展开等优化,从而生成不同的高效代码。
该术语来自 C++ 的“模板(template)”体系:早期模板参数主要是“类型参数(type parameter)”,而实践中经常需要把常量值也纳入模板实例化过程,于是出现了“non-type(非类型)template parameter(模板参数)”这一说法,强调它传入的是“值”而不是“类型”。随着 C++ 标准演进,非类型模板参数可接受的形式逐步扩展(例如更广义的编译期常量对象)。